【コンテナ技術入門】コンテナ要素技術をDocker使わずに基礎から手を動かして学べる超有用なテキスト #dockerTokyo
「Dockerって、結局中でなにやってんの?」
先日、以下のミートアップに参加して、LT登壇してきました。
自分はLTの一番手として、「雰囲気でコンテナ使っている 全ての人が読むべき 「コンテナ技術入門」の紹介」で喋ってきたので、それの登壇報告となります。
「コンテナ技術入門」は、Dockerコマンド一通り使えるようになってきたけど、もっとDockerやコンテナについて深く知っておきたいという方にはむちゃくちゃ有用なコンテンツなので、一度目を通して、実際に手を動かして試してみることをオススメします。
(祭) ∧ ∧ Y ( ゚Д゚) Φ[_ソ__y_l〉 コンテナマツリダワッショイ |_|_| し'´J
講演概要
当日のセッションスライドはこちら。
この記事では、LTという時間枠の中で省略してしまった事項もあれこれ追加して、セッション内容を一記事として再構成しています。
セッション「雰囲気でコンテナ使っている全ての人が読むべき「コンテナ技術入門」の紹介」
自己紹介です。パワーポイントにデザインまかせたら、こんなレイアウトになりました。テクノロジーってすごいですね。ハマコー(@hamako9999)です。
一番最初にお聞きしたい。皆さんこの記事ご存知ですか?
コンテナ技術入門 - 仮想化との違いを知り、要素技術を触って学ぼう - エンジニアHub|若手Webエンジニアのキャリアを考える!
さらにお聞きしたい。この記事を読んで、最後まで手を動かして学んだ人、どれぐらいいますか?
そうですよね。ほとんどいませんよね。一言「非常にもったいない!!」という思いです。
本日お話する内容は以下の通り。
- 「コンテナ技術入門」にかかれていること
- 「コンテナ技術入門」やって感じたこと
- 「コンテナ技術入門」が素晴らしいところ
「コンテナ技術入門」にかかれていること
書かれていることは、スバリこれです。
具体的には、技術スタックとしてこういった要素が出てきます。
- Namespace → カーネルリソースの隔離
- cgroup → リソース制限
- Capability → 権限制限
- chrootとpivot_root → 権限制限
- OverlayFS → ファイルシステムの階層化
- Network Namespace → ネットワークの隔離
この記事の最大の特徴がこちら。
これ、面白いんですよ。Dockerコマンド一切使わずに、コンテナっぽいものが出来上がる。なので、Dockerの基本的な使い方はあらかじめ知っておいたほうが、この記事は楽しめます。
一部、Dockerコマンドありますが、これは既存のイメージからファイルを抜き出すのに使っているだけなので、コンテナの動作に直接Dockerコマンドは使われません。
実行環境の用意
是非自分の手で動かしながら学んでいただきたい題材なので、実行環境用意しましょう。方法はいくつかあります。
Vagrantを使う場合
記事の実行環境はUbuntuです。記事では、Vagrantfileが記載されているので、それを使えば環境用意できます。
EC2を使う場合
自分は普段慣れているAWSのEC2を使いました。特に難しいことはなく、AMIからUbuntuを選択し、以下のスクリプト流せば、この記事のコマンドは一通り動きました。
sudo apt-get update sudo apt-get install apt-transport-https ca-certificates curl software-properties-common jq curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get install -y docker-ce sudo apt-get install -y cgdb sudo apt-get install -y cgroup-tools sudo apt-get install -y uuid-runtime sudo apt-get install -y tree sudo apt-get install -y iputils-ping sudo apt-get install -y make gcc sudo git clone git://git.kernel.org/pub/scm/linux/kernel/git/morgan/libcap.git /usr/src/libcap cd /usr/src/libcap sudo make sudo make install
その他仮想マシンを使う場合
おそらくは、VPSや他のパブリッククラウドのUbuntuベースの仮想マシンを用意するだけで、動作確認はできると思います。
紹介されている要素技術(抜粋)
この記事では、かなり多数のコンテナを支える要素技術が紹介されているんですが、抜粋して自分がやってて楽しかったところを中心に紹介します。
「コンテナを作ってみよう」
<事前準備> - cgroupでリソース(CPUとメモリ)制限 - Namespaceでリソース隔離 - コンテナ内で「yes >/dev/null」
<動作確認>
- 別シェルでps(プロセス)確認
- topコマンドで利用時間確認
一番最初のこの章でキモなのが、コンテナをDockerを使わずに作ってみるところ。機能は限定されていますが、Linuxのcgroup
とNamespace
を使って、CPU利用率制限されたbashを別プロセスで動かします。
コンテナがプロセスを共有していること、そのプロセスがハードウェア利用制限されて動作していること、これを肌身で知ることができます。流れの中で一部dockerコマンドを使っているところがありますが、単にbashコンテナイメージの中身をtar展開しているだけです。
別シェルでps
コマンドの実行で、コンテナ内プロセスの確認ができること、top
コマンドで、コンテナ内yes
プロセスのCPU利用時間が30%に制限されていることなどが、実際に確認できます。これ、楽しいですよ。
この例で「コンテナはホストOS上のプロセスではあるけれど、コンテナ内からは独立した環境に見える」ことが確認できたと思います。また、コンテナに対して使用できるリソースを制限できることも確認できました。
引用:コンテナ技術入門 - 仮想化との違いを知り、要素技術を触って学ぼう - エンジニアHub|若手Webエンジニアのキャリアを考える!
関連してcgroupの動きを確認すると面白い。
別シェルからsystemd-cgtop
でも、作成されたcgroupのCPU利用率などがわかります。
Control Group Tasks %CPU Memory Input/s Output/s / 144 30.7 1.3G - - /bb178911-6ac4-4fe7-906b-a5279492a745 - 29.7 1.0M - - /user.slice 12 0.7 815.2M - - /system.slice 68 0.2 602.3M - - /system.slice/containerd.service 13 0.2 19.9M - -
ここで、コンテナを作る雰囲気を感じ取りましょう。
「Namespace」
Namespaceはプロセスが参照するPID(プロセスID)番号空間やマウントポイントなど、カーネルリソースを他のプロセスと隔離し、独立したOS環境のように見せる機能です。
引用:コンテナ技術入門
コンテナ技術のキモとなる、Namespaceについて学んでいきます。
- Namespaceの操作方法
- Namespaceを確認する
- Namespaceを隔離する
- Namespaceに接続する
- Namespaceを維持する
これらをコマンド使いながら試すことで、プロセスの分離イメージが把握できます。
「cgroup」
cgroupはグループ化したプロセスに対してカーネルリソースやハードウェアリソースを制限することができる機能です。
引用:コンテナ技術入門
「Capability」
Capabilityはroot権限を細分化してプロセスやファイルに設定する機能です。特権(root)ユーザで動作するプロセスは全ての権限を持つため、実行しているプログラムに脆弱性があった場合、他のプロセスやホストOSそのものに影響を与えてしまいます。
引用:コンテナ技術入門
「OverlayFS」
<事前準備>
- サンプルのDockerfile確認
- LAYER1の作成(既存イメージの展開)
- LAYER2の作成(LAYER1にcurlを埋め込み)
<動作確認>
- LAYER1と2をOverlayFSでコンテナイメージ作成
Dockerfileでコマンドを書くたびに、イメージのレイヤーが増えていくことはなんとなくご存知の方が多いと思いますが、その動作原理として動くOverlayFS
を体験できます。
「ネットワークリソースの隔離」
<事前準備>
- ネットワークブリッジ作成
- Network Namespace作成
- vethペアを作成、ネットワークブリッジに追加
- デフォルトゲートウェイ設定
<動作確認>
- ブリッジとNamespaceの疎通確認
docker runするときによくホスト側とコンテナ側のポートマッピングをしますが、そこの動作が根っこでどうなっているかを確認できます。
「コンテナ技術入門」をやって感じたこと
というわけで、非常に多くの要素技術が出てくるんですが、この「コンテナ技術入門」やって、実際に感じたことは、一言「しんどい」です。
自分はアプリレイヤーのキャリアが長いので、ほんと知らない概念だらけで苦労しました。コマンド流すだけだったらすぐ終わりますが、途中あれこれ調べてると、どんどん時間使います。自分の興味があるところを試してみる感じでも良いんじゃないでしょうか。
「コンテナ技術入門」が素晴らしいところ
最後に、この記事の何が素晴らしいかをお話します。
この記事読んで要素技術を学んでみると、例えば以下の事象が深掘りできてくるんですね。
- なぜ、コンテナランタイムがこんなに山のようにあるのか?
- なぜ、Dockerfileの書き方が、イメージサイズに直結するのか?
- なぜ、複数コンテナたてたときのネットワーク管理があんなにめんどいのか?
- なぜ、Fargateみたいなホストインスタンスがないコンテナの運用がでてきたのか?
「一度Linuxの要素技術でコンテナがどのように動いているか体験することで、コンテナの使い所や進化の方向性が見えてくる」と思います。皆さんの、これからの長いコンテナ人生をよりよいものにするための基礎として、一度試してみてはいかがでしょうか。
「最後に圧倒的感謝を!」
これだけ詳細にコンテナの要素技術を解説が解説されていて、さらにそれがハンズオン形式で試すことができるコンテンツとして日本語で提供されているのは、ある意味奇跡じゃないでしょうか。
この場を借りて、この記事の作者である、バッグマン(@hayajo)さんに改めて感謝したいと思います。ありがとうございます!
「コンテナのいろんな話が凝縮されていて、ごっつ楽しいミートアップでした」
自分はLTトップだったので、それが終わったあとは、最前列でtwitterでヤジとばしながらリラックスして、他の方のLTを聞くことができました。分野がいろいろあって、ごっつ楽しかったですね。LTならではのごった煮感が最高でした。
イベント終わったあと、やばい人達とコンテナランタイムについてのDeepすぎる話もできたのが収穫。はっきり言ってそこは魔境だと思ってたし、「すぐ業務には関係ないだろうしな…」と遠巻きに眺めていた分野だったんですが、kubectlからOSレイヤーまでの流れと、関連技術になにがあるのかを、いろんな角度から話してもらって全体感が整理できてむっちゃ有用でした。
イベント終わったあとまで延々こんなの話してますからね。怖い。もしかしたら、コンテナランタイムミートアップとかいう、誰得な企画が爆誕するかもしれません。ニーズあるんかそれ…って感じですが、今後も要チェックですよ!
自分も、これをきっかけにFirecrackerが何なのか、改めて勉強してみようと思います。
DockerMeetupは、今後も続いていくイベントだと思うので、気になる方はイベントページ登録してみてはいかがでしょうか。
Docker Meetup Tokyo - connpass
それでは、今日はこのへんで。濱田(@hamako9999)でした。
参考にさせていただいたサイト
自分がこの「コンテナ技術入門」をあれこれ勉強し試しながら、合わせて参考にさせていただいたページです。自分は基本的なコマンド(ps
とか)でも、理解が曖昧な部分が多々あったので、その点でも非常に勉強になりました。
- psコマンドについて詳しくまとめました 【Linuxコマンド集】
- 俺は Linux コンテナについてなんにも解っていなかった 〜 haconiwa で学ぶ Linux コンテナ (1) 〜 - ようへいの日々精進XP
- nsenter・docker-enterでコンテナに入る方法 - Qiita
- mountコマンドについてまとめました【Linuxコマンド集】
- SUID(Set User ID) - 特殊なアクセス権
また、コンテナ技術をビジュアライズ化された資料で学びたい方は、これも鉄板の素晴らしい資料です。是非こちらも参考にしてみてください。
また、現在群雄割拠のコンテナランタイム動向については、こちらにまとめられています。